跳到主要内容

Go 语言的运行时 runtime 设置

运行时(runtime)包

runtime 包提供和 go 运行时环境的互操作,如控制 go 协程的函数。它也包括用于 reflect 包的低层次类型信息;

让出时间片

让出 CPU 时间片,重新等待安排任务

import (
"fmt"
"runtime"
)

func main() {
go func(s string) {
for i := 0; i < 2; i++ {
fmt.Println(s)
}
}("world")

// 主协程
for i := 0; i < 2; i++ {
// 切一下,再次分配任务
runtime.Gosched() // 这次让出时间片
fmt.Println("hello")
}
}

退出当前协程

import (
"fmt"
"runtime"
)

func main() {
go func() {
defer fmt.Println("A.defer")
// 执行一个匿名函数
func() {
defer fmt.Println("B.defer")
// 结束协程
runtime.Goexit()
defer fmt.Println("C.defer") // 不执行
fmt.Println("B") // 不执行
}()
fmt.Println("A") // 不执行
}()

for {
}
}

打印结果为

B.defer
A.defer
// 因为下面 for 是死循环,所以手动结束进程

设置占用核心数目

因为协程本质还是执行在 Go 运行时分配的大型 “线程池” 中,所以可以使用 GOMAXPROCS 参数来确定需要使用多少个 OS 线程来同时执行 Go 代码(默认值是机器上的CPU核心数)

func a() {
for i := 1; i < 10; i++ {
fmt.Println("A:", i)
}
}

func b() {
for i := 1; i < 10; i++ {
fmt.Println("B:", i)
}
}

func main() {
runtime.GOMAXPROCS(1)
go a()
go b()
time.Sleep(time.Second)
}

如上指定了只使用一个线程,此时是做完一个任务再做另一个任务。